package com.atguigu.crowd.mvc.controller;

import com.atguigu.crowd.entity.Admin;
import com.atguigu.crowd.service.AdminService;
import com.autguigu.crowd.constant.CrowdConstant;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;

/**
 * admin的controller
 *
 * @author wmb
 *
 * @since 2021-1-18
 */
@Controller
public class AdminController {

    private Logger logger = LoggerFactory.getLogger(AdminController.class);

    @Autowired
    @Qualifier("adminService")
    private AdminService adminService;

    @RequestMapping(value = "/admin/update.html", method = RequestMethod.POST)
    public String update(Admin admin,
                         @RequestParam("pageNum") Integer pageNum,
                         @RequestParam("keyword") String keyword) {

        adminService.update(admin);

        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }

    @RequestMapping("/admin/to/edit/page.html")
    public String toEditPage(
            @RequestParam("adminId") Integer adminId,
            Model model) {

        // 1.根据adminId查询Admin对象
        Admin admin = adminService.getAdminByAdminId(adminId);

        // 2.将Admin对象存入模型
        model.addAttribute(CrowdConstant.ATTR_NAME_PAGE_EDIT, admin);

        return "admin-edit";
    }

    @PreAuthorize("hasAuthority('user:save')")
    @RequestMapping(value = "/admin/save.html", method = RequestMethod.POST)
    public String save(Admin admin) {

        adminService.saveAdmin(admin);

        return "redirect:/admin/get/page.html?pageNum="+Integer.MAX_VALUE;
    }

    @RequestMapping("/admin/remove/{adminId}/{pageNum}/{keyword}.html")
    public String remove(
                    @PathVariable("adminId") Integer adminId,
                    @PathVariable("pageNum") Integer pageNum,
                    @PathVariable("keyword") String keyword) {
        // 执行删除
        adminService.remove(adminId);

        // 页面跳转：回到分页页面

        // 尝试方案1：直接转发到admin-page.jsp会无法显示分页数据
//        return "admin-page";

        // 尝试方案2：转发到/admin/get/page.html地址，一旦刷新页面会重复执行删除浪费性能
//        return "forward:/admin/get/page.html";

        // 尝试方案3：重定向到/admin/get/page.html
        // 同时为了保持原本所在的页面和查询关键词再附加pageNum和keyword两个请求参数
        return "redirect:/admin/get/page.html?pageNum="+pageNum+"&keyword="+keyword;
    }

    @RequestMapping(value = "/admin/get/page.html")
    public String getPageInfo(
                              // 使用@RequestParam注解的defaultValue属性，指定默认值，在请求中没有携带对应参数时使用默认值
                              // keyword默认值使用""，和SQL语句配合实现两种情况的适配
                              @RequestParam(value = "keyword", defaultValue = "") String keyword,
                              // pageNum默认值使用1
                              @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                              // pageSize默认值使用5
                              @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                              Model model) {
        // 调用Service方法获取PageInfo对象
        PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);

        // 将PageInfo对象存入模型
        model.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);

        return "admin-page";
    }

    @RequestMapping(value = "/admin/do/logout.html")
    public String doLogout(HttpSession session) {
        // 强制Session失效
        session.invalidate();
        return "redirect:/admin/to/login/page.html";
    }

    @RequestMapping(value = "/admin/do/login.html", method = RequestMethod.POST)
    public String doLogin(@RequestParam("loginAccount") String loginAccount,
                          @RequestParam("password") String password,
                          HttpSession session) {
        // 调用Service方法执行登录检查
        // 这个方法如果能够返回admin对象说明登录成功，如果账号、密码不正确则会抛出异常
        Admin admin = adminService.getAdminByUsername(loginAccount, password);
        logger.info(admin.toString());

        // 将登录成功返回的admin对象存入Session域
        session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, admin);

        return "redirect:/admin/to/main/page.html";
    }
}
